/*
  栈
  1. 和队列一样是比较常见的 受限的线性结构(后进先出/LIFO) 

*/

//栈的封装(通常有两种实现方式)
//1. 基于数组实现栈
class Stack {
  constructor() {
    //栈中的元素
    this.items = [];
  }
  //栈常用方法
  //入栈
  push(el) {
    this.items.push(el);
  }
  //出栈
  pop() {
    return this.items.pop();
  }
  //查看栈顶元素
  peek() {
    if (this.isEmpty()) {
      throw new Error("栈长度为空");
    }
    return this.items[this.size() - 1];
  }
  //栈的长度
  size() {
    return this.items.length;
  }
  //判断栈的元素是否为空
  isEmpty() {
    return this.size() === 0;
  }
  //查看栈中所有元素
  toString() {
    return this.items.reduce((acc, curr) => (acc += curr + " "), "");
  }
}

//2. 基于链表实现
